package cn.ctbu.xiaopeng.studentscoremanage.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 记录各个方法的执行耗时时间
 * @author xiaopeng
 * @version 1.0
 */
@Slf4j
@Component //将该类交给IOC容器管理
@Aspect //将该类表示为AOP类
@Order(3) //利用Order注解更改默认(依据类名)的顺序
public class TimeAspect {
    @Around("execution(* cn.ctbu.xiaopeng.studentscoremanage.service.*.*(..))") //注解@Around用于设置针对的范围，后面的表达式称为切入点表达式
    //cn.ctbu.xiaopeng.studentscoremanage.service，表示包名
    //第一个*表示任意类型的返回值，第二个*表示任意类名，第三个*表示任意方法名
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //1.记录开始时间
        long beginTime = System.currentTimeMillis();
        //2.调用原始方法运行
        Object object = proceedingJoinPoint.proceed(); //执行原始方法并获取返回值
        //3.记录结束时间，计算方法执行耗时
        long endTime = System.currentTimeMillis();
        log.info(proceedingJoinPoint.getSignature()+"\t执行耗时：{}ms",endTime-beginTime);
        return object; //返回原始方法的返回值
    }
}